package co.com.coomeva.adminEvaluacion.delegado;

import java.util.List;

import co.com.coomeva.adminEvaluacion.logica.CargoLogica;
import co.com.coomeva.adminEvaluacion.logica.DivisionLogica;
import co.com.coomeva.adminEvaluacion.logica.EdPEstadoLogica;
import co.com.coomeva.adminEvaluacion.logica.EdPItemLogica;
import co.com.coomeva.adminEvaluacion.logica.EdPModuloLogica;
import co.com.coomeva.adminEvaluacion.logica.EdPPeriodoEvaluacionLogica;
import co.com.coomeva.adminEvaluacion.logica.EvaRoleCargoLogica;
import co.com.coomeva.adminEvaluacion.modelo.entidades.Cargo;
import co.com.coomeva.adminEvaluacion.modelo.entidades.Division;
import co.com.coomeva.adminEvaluacion.modelo.entidades.EdPEstado;
import co.com.coomeva.adminEvaluacion.modelo.entidades.EdPItem;
import co.com.coomeva.adminEvaluacion.modelo.entidades.EdPModulo;
import co.com.coomeva.adminEvaluacion.modelo.entidades.EdPPeriodoEvaluacion;
import co.com.coomeva.adminEvaluacion.modelo.entidades.EvaRoleCargo;
import co.com.coomeva.adminEvaluacion.modelo.entidades.consulta.Consulta;

/*
 * Los Bean siempre se dirigen primero a esta clase
 */
public class DelegadoEdPItem {
	public static EdPItemLogica logicaItem = null;	
	private static DelegadoEdPItem delegado = null;
	
	/**
	 * Metodo que permite obtener una instancia de la clase
	 * @return Instancia de la clase
	 */
	public static DelegadoEdPItem getInstance() {
		if(delegado == null){
			delegado = new DelegadoEdPItem();
			logicaItem = EdPItemLogica.getInstance();
		}		
		return delegado;
	}
	
	/**
	 * Metodo que realiza el llamado al metodo que permite crear un item en la base de datos
	 * @param descripcion Descripcion del item
	 * @param estado Estado del item
	 * @param porcentaje Porcentaje del item
	 * @param codCargo Codigo del cargo
	 * @param codCiudad Codigo de la ciudad
	 * @param codPeriodo Codigo del periodo
	 * @param codModulo Codigo del modulo
	 * @param codRol Codigo del rol 
	 * @throws Exception
	 */
	public void crearItem(String descripcion, String estado,
			Long porcentaje, String codCargo, String codCiudad, Long codPeriodo,
			Long codModulo, Long codRol) throws Exception {
		logicaItem.crearItem(descripcion, estado, porcentaje, codCargo, codCiudad,
				codPeriodo, codModulo, codRol);
	}

	/**
	 * Metodo que realiza el llamado al metodo que permite consultar un item en la base de datos
	 * @param consItem Consecutivo del item
	 * @param descripcion Descripcion del item
	 * @param estado Estado del item
	 * @param porcentaje Porcentaje del item
	 * @param codCargo Codigo del cargo
	 * @param codCiudad Codigo de la ciudad
	 * @param codPeriodo Codigo del periodo
	 * @param codModulo Codigo del modulo
	 * @param codRol Codigo del rol 
	 * @return Lista del tipo consulta con los items consultados 
	 * @throws Exception
	 */
	public List<Consulta> consultarItems(Long consItem, String descripcion, String estado,
			Long porcentaje, String codCargo, String codCiudad, Long codPeriodo,
			Long codModulo, Long codRol, Long consGerencia) throws Exception {
		return logicaItem.consultarItems(consItem, descripcion, estado, porcentaje, codCargo, codCiudad,
							codPeriodo, codModulo, codRol, consGerencia);
	}

	/**
	 * Metodo que realiza el llamado al metodo que permite consultar un item en la base de datos
	 * @param consItem Consecutivo del item
	 * @return Objeto del tipo EdPItem con los datos del item consultado 
	 * @throws Exception
	 */
	public EdPItem consultarItemPorID(Long consItem) throws Exception {
		return logicaItem.consultarItemPorID(consItem);
	}

	/**
	 * Metodo que realiza el llamado al metodo que permite actualizar un item en la base de datos
	 * @param consItem Consecutivo del item
	 * @param descripcion Descripcion del item
	 * @param estado Estado del item
	 * @param porcentaje Porcentaje del item
	 * @param codCargo Codigo del cargo
	 * @param codCiudad Codigo de la ciudad
	 * @param codPeriodo Codigo del periodo
	 * @param codModulo Codigo del modulo
	 * @param codRol Codigo del rol
	 * @param usuarioRed Usuario de la red que realiza la actualizacion
	 * @throws Exception
	 */
	public void actualizarItem(Long consItem, String descripcion, String estado,
			Long porcentaje, String codCargo, String codCiudad, Long codPeriodo,
			Long codModulo, Long codRol, String usuarioRed, Long consGerencia) throws Exception {
		logicaItem.actualizarItem(consItem, descripcion, estado, porcentaje, codCargo, codCiudad,
				codPeriodo, codModulo, codRol, usuarioRed, consGerencia);
	}

	/**
	 * Metodo que realiza el llamado al metodo que permite eliminar un item en la base de datos
	 * @param consItem Consecutivo del item
	 * @param usuarioRed Usuario de la red que realiza la actualizacion
	 * @throws Exception
	 */
	public void eliminarItem(Long consItem, String usuarioRed, Long consGerencia) throws Exception {
		logicaItem.eliminarItem(consItem, usuarioRed, consGerencia);
	}
	
	/**
	 * Metodo que realiza el llamado al metodo que permite consultar los periodos
	 * @return Lista del tipo EdPPeriodoEvaluacion con los periodos consultados
	 * @throws Exception
	 * @Deprecated
	 */
	/*
	public List<EdPPeriodoEvaluacion> consultarPeriodos() throws Exception {
		EdPPeriodoEvaluacionLogica objPeriodoEvaluacion = EdPPeriodoEvaluacionLogica.getInstance();	
		return objPeriodoEvaluacion.consultarPeriodoEval(null, null, null, null, null, null, null);
	}
	*/
	
	
	/**
	 * Metodo que realiza el llamado al metodo que permite consultar los modulos
	 * @return Lista del tipo EdPModulo con los modulos consultados
	 * @throws Exception
	 */
	public List<EdPModulo> consultarModulos() throws Exception {
		EdPModuloLogica objEdPModuloLogica = EdPModuloLogica.getInstance();	
		return objEdPModuloLogica.consultarModulos(null, null, null, null, null, null, null, null);
	}
		
	/**
	 * Metodo que realiza el llamado al metodo que permite consultar los roles segun el cargo seleccionado
	 * @return Lista del tipo EvaRoleCargo con los roles consultados
	 * @throws Exception
	 */
	public List<EvaRoleCargo> consultarRolesXCargo(String codCargo) throws Exception {
		
		Long codCar = null;
		if(codCargo != null && !codCargo.equals("-1")){
			codCar = new Long(codCargo);

			//System.out.println("codCar = " + codCar);
			EvaRoleCargoLogica objEvaRoleCargoLogica = EvaRoleCargoLogica.getInstance();
			return objEvaRoleCargoLogica.consultarRolesXCargo(codCar, null, null);
		}
		else
			return null;
	}
	
	/**
	 * Metodo que realiza el llamado al metodo que permite consultar los cargos
	 * @return Lista del tipo EvaRoleCargo con los cargos consultados
	 * @throws Exception
	 */
	public List<Cargo> consultarCargos(Long gerenciaCodigo, Long unidadNegocio) throws Exception {
		CargoLogica objCargoLogica = CargoLogica.getInstance();
		return objCargoLogica.consultarCargos(null, null, gerenciaCodigo, unidadNegocio);
	}

	/**
	 * Metodo que realiza el llamado al metodo que permite consultar las ciudades
	 * @return Lista del tipo Division con las ciudades consultadas
	 * @throws Exception
	 */
	public List<Division> consultarCiudades(Long gerenciaCodigo) throws Exception {
		DivisionLogica objDivisionLogica = DivisionLogica.getInstance();	
		return objDivisionLogica.consultarCiudades(null, gerenciaCodigo, null, null, null, null);
	}
	
	/**
	 * Metodo que realiza el llamado al metodo que permite consultar los estados
	 * @return Lista del tipo EdPEstado con los estados consultados
	 * @throws Exception
	 */
	public List<EdPEstado> consultarEstados() throws Exception {
		EdPEstadoLogica objEdPEstadoLogica = EdPEstadoLogica.getInstance();	
		return objEdPEstadoLogica.consultarEstados(null, null);
	}

	/**
	 * Metodo que realiza el llamado al metodo que permite consultar si existen items en modulos cerrados
	 * @param codPeriodo Periodo de la empresa que inicio sesion
	 * @return Booleano que indica si existen items o no
	 * @throws Exception
	 */
	public boolean existenItemsEnModulosCerrados (Long codPeriodo) throws Exception {	
		 return logicaItem.existenItemsEnModulosCerrados(codPeriodo);
	}
	
	/**
	 * Metodo que realiza el llamado al metodo que permite generar el reporte de inconsistencias
	 * @return String con el mensaje que indica si se genero el reporte o no
	 */
	public String generarReporteInconsistencias(Long codPeriodo) {
		return logicaItem.generarReporteInconsistencias(null, "", codPeriodo);
	}
	
	/**
	 * Metodo que permite obtener el nombre del archivo generado que contiene el reporte de inconsistencias
	 * @return String con el nombre del archivo
	 */
	public String obtenerArchInconsistencias() {
		return logicaItem.getStrNombreArchivo();
	}
}
